#第8单元
# 随机生成500个点，生成代码如下：
# x = np.arange(0, 1, 0.002)
# y = norm.rvs(0, size=500, scale=0.1)
# y = y + x**2
# 请尝试用1、2、100次方的多项式对该数据进行拟合

import numpy as np
import scipy.stats as stats
import matplotlib.pylab as plt

from pylab import *                             #显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']    #显示中文

#随机生成500点
x=np.linspace(0,1,500)
x=np.arange(0,1,0.002)
y=stats.norm.rvs(10,size=500,scale=0.1)     #随机产生500个数,sigma=0.1
y=y+x**2

#用1次方拟合
z1=np.polyfit(x,y,1)   #调用np.polyfit进行拟合，返回多项式对象
p1=np.poly1d(z1)       #调用np.ployld得到多项式表达式
print(p1)
print('p1训练集精度score(=1-u/v):',1-((p1(x)-y)**2).sum()/((p1(x)-y.mean())**2).sum())

#画图(1次多项式拟合)
plt.figure('1次多项式拟合')
plt.scatter(x,y)
plt.plot(x,p1(x),'r')
plt.show()

#用2次方拟合
z2=np.polyfit(x,y,2)
p2=np.poly1d(z2)
print(p2)
print('p2训练集精度score(=1-u/v):',1-((p2(x)-y)**2).sum()/((p2(x)-y.mean())**2).sum())

#画图(2次多项式拟合)
plt.figure('2次多项式拟合')
plt.scatter(x,y)
plt.plot(x,p2(x),'r')
plt.show()

#用100次方拟合
z100=np.polyfit(x,y,100)
p100=np.poly1d(z100)
print(p100)
print('p100训练集精度score(=1-u/v):',1-((p100(x)-y)**2).sum()/((p100(x)-y.mean())**2).sum())

#画图(100次多项式拟合)
plt.figure('100次多项式拟合')
plt.scatter(x,y)
plt.plot(x,p100(x),'r')
plt.show()

